package cn.edu.tju.wallet.repository;

import cn.edu.tju.wallet.domain.VipLevel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * VIP等级数据访问层
 */
@Repository
public interface VipLevelRepository extends JpaRepository<VipLevel, Long> {

    /**
     * 根据等级数值查找VIP等级
     * @param level 等级数值
     * @return VIP等级
     */
    Optional<VipLevel> findByLevel(Integer level);

    /**
     * 根据状态查找所有激活的VIP等级
     * @param status 状态
     * @return VIP等级列表
     */
    List<VipLevel> findByStatus(VipLevel.RuleStatus status);

    /**
     * 查找所有激活的VIP等级，按优先级降序排序
     * @return VIP等级列表
     */
    @Query("SELECT v FROM VipLevel v WHERE v.status = :status ORDER BY v.priority DESC")
    List<VipLevel> findAllActiveOrderByPriority(@Param("status") VipLevel.RuleStatus status);

    /**
     * 根据等级名称查找
     * @param name 等级名称
     * @return VIP等级
     */
    Optional<VipLevel> findByName(String name);

    /**
     * 检查指定等级的VIP等级是否存在
     * @param level 等级数值
     * @return 是否存在
     */
    boolean existsByLevel(Integer level);

    /**
     * 检查指定名称的VIP等级是否存在（排除当前ID）
     * @param name 等级名称
     * @param id 当前ID
     * @return 是否存在
     */
    @Query("SELECT COUNT(v) > 0 FROM VipLevel v WHERE v.name = :name AND v.id != :id")
    boolean existsByNameAndIdNot(@Param("name") String name, @Param("id") Long id);

    /**
     * 查找所有VIP等级，按等级数值升序排序
     * @return VIP等级列表
     */
    List<VipLevel> findAllByOrderByLevelAsc();
}
